package com.xm.queue.task2;

import lombok.extern.slf4j.Slf4j;

/**
 * 任务管理者
 */
@Slf4j
public class TaskManager {
    private final IQueue taskQueue;
    private final boolean limit;

    /**
     * 初始化任务队列
     * @param type 0-ArrayBlockingQueue；1-LinkedBlockingQueue；其他-ConcurrentLinkedQueue
     * @param limit true 限流
     * @param fair true 公平竞争，仅type=0时设置值
     */
    public TaskManager(final int type, final boolean limit, final Boolean fair) {
        if (type == 0) {
            log.info("正在创建任务队列 ArrayBlockingQueue，是否限流 = {}，是否公平竞争 = {}", limit, fair);
            this.taskQueue = new TaskArrayBlockingQueue(fair);
        } else if (type == 1) {
            log.info("正在创建任务队列 LinkedBlockingQueue，是否限流 = {}，是否公平竞争 = {}", limit, fair);
            this.taskQueue = new TaskLinkedBlockingQueue();
        } else {
            log.info("正在创建任务队列 ConcurrentBlockingQueue，是否限流 = {}，是否公平竞争 = {}", limit, fair);
            this.taskQueue = new TaskConcurrentLinkedQueue();
        }
        this.limit = limit;
    }

    public void addTask(ITask task) throws InterruptedException {
        if (this.limit) {
            this.taskQueue.putTryAcquire(task);
        } else {
            this.taskQueue.put(task);
        }
    }

    public ITask getTask() throws InterruptedException {
        if (this.limit) {
            return this.taskQueue.takeTryAcquire();
        } else {
            return this.taskQueue.take();
        }
    }

    public ITask getTask2() throws InterruptedException {
        if (this.limit) {
            return this.taskQueue.pollTryAcquire();
        } else {
            return this.taskQueue.poll();
        }
    }

    public int getQueueSize() {
        return this.taskQueue.size();
    }
}
